VisualHMI - 关于LUA
本章节主要介绍Lua的特性,以及开发过程的相关建议
1. 如何新建 main.lua
在菜单工程栏→脚本编程,打开脚本编程工具后,默认会自动部分代码,并且在工程目录下默认生成main.lua文件,以Modbus 为例,如下所示
自动生成的main.lua含以下3部分
1.1.加密
当设置 ENCRYPT =1时,编译生成private下载资源包,当前*.lua文件将进行加密。实体屏上电时,将会解密在运行
_ENCRYPT_=0 --LUA脚本加密
1.2.数据类型声明
以Modbus协议为例,默认生成的main.lua,自动声明数据类型如下所示:
--数据类型定义
VT_LW = 1 --变量地址
VT_RW = 2 --FLASH存储
VT_0x = 10 --线圈
VT_1x = 11 --输入点
VT_3x = 12 --输入寄存器
VT_4x = 13 --保持寄存器
若协议为Fx2N,自动声明数据类型如下所示:
--数据类型定义
VT_LW = 1 --变量地址
VT_RW = 2 --FLASH存储
VT_X = 10 --输入位
VT_Y = 11 --输出位
VT_S = 12 --状态位
VT_M = 13 --辅助位
VT_D = 14 --数据
VT_T = 15 --定时器值(字)
VT_C = 16 --16位计数器值
VT_CX = 17 --32位计数器值
1.3.系统回调函数
默认生成的main.lua,自动添加常见的系统回调函数,若项目中用到其他系统回调函数,可参考ViusalHMI - LUA API(点击跳转)
function on_init()
end
function on_run(screen)
end
function on_update(slave,vtype,addr)
end
function on_draw(screen_id,control_id)
end
2. 如何编辑LUA
编辑Lua文件,除了用ViusalHMI上位机自带的编辑器,可以使用第三方软件编写,如NotePad++、Lua editor、Vs Code等等
编辑程序取决于用户习惯,选择对应的编辑软件即可
重点
注意!!!
多个编辑软件打开同一个项目的LUA程序,编辑软件可能会自动保存,导致代码不同步、文件编码(UTF8/GB23120)异常
2.1. NotePad++
用NotePad++ 软件打开编辑,如下所示:
2.2. Lua editor
用Lua editor 软件打开编辑,如下所示:
2.3. Vs Code
用Vs Code 软件打开编辑,如下所示:
3.如何查错
Lua属于解释性语言,编写的逻辑代码只有在程序运行的过程才会发现逻辑错误,即可以通过虚拟屏、运行相关业务逻辑查看是否有BUG,不支持断点调试
如下所示一段代码
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1001
then
local val = get_uint16(vtype,addr)
mb_write_reg_06(1, 0x0000, val)
end
end
end
3.1.虚拟屏调试
运行虚拟屏,点击修改寄存器0x1001,虚拟屏的设置窗口,显示错误,如下所示
如下所示:在[ ENCRYPT =0 --LUA脚本加密...]开头的文件lua文件的78行,出现一个错误信息,mb_write_reg_06为nil值,找不到变量/函数, 即可从该行的上下文、逻辑等排查异常
DBG [string "_ENCRYPT_=0 --LUA脚本加密..."]:78: attempt to call a nil value (global 'mb_write_reg_06')
重点
常见LUA异常:
1.空值:nil,attempt to call a nil value。常见变量未定义、函数未定义、空表等
2.类型:number expected, got string(希望是数值,但是当前参数为字符串),如 bad argument #3 to 'set_uint16',number expected, got string
3.重启:定义的表格过大内存溢出、循环体过大开门狗复位
3.2.实体屏调试
屏幕一般有一路TTL电平调试串口信息输出。以HMI80480M070硬件为例,PCB上有1个2.54间距的排针,丝印一般为J2,方孔+圆孔组成。其中,方孔为GND,圆孔为屏幕TX
重点
串口配置:
1.USB转TTL
2.115200波特率,8N1
3.ASSIC显示
4.个别型号或定制的硬件,是多路串口,其中本调试串口将被作为第2路串口使用,固不支持调试信息输出
实体屏错误信息(举例),如下所示:
4. 如何分模块
若功能比较复杂,代码量比较大,建议分多Lua文件模块,编辑管理
- 在工程目录下,新建*.lua文件,如下所示
- 在初始化on_dofile('*.lua')文件,如下所示
--初始化函数
function on_init()
dofile('wbrCom.lua')
dofile('dp.lua')
dofile('gui.lua')
dofile('ota.lua')
dofile('file.lua')
dofile('wbrCfg.lua')
set_string(VT_LW, regAddr.mcu_ver, 'V'..ProductKey.v)
uart_setup(1, 115200, 8, 0, 0)
end